import {logger, errorLogger} from "../config/logger.js"; // 引入日志配置

class ResponseHandler {
    /**
     * @description 处理响应结果并返回给客户端
     * @param {Object} res - 响应对象
     * @param {any} data - 响应数据
     * @param {string|null} message - 响应消息
     * @returns {Object} 返回响应结果
     */
    static async responseResult(res = null, data = null, message = null) {
        if (!res) return this.handleNullResponse(data, message); // 检查 res 是否为 null

        message = message || this.getDefaultMessage(res.statusCode || 500);
        await this.logResponse(res.statusCode || 500, message);

        return res.status(res.statusCode || 500).json({
            status: this.getResponseStatus(res.statusCode || 500),
            message,
            data,
        });
    }

    /**
     * @description 处理 res 为 null 的情况
     * @param {any} data - 响应数据
     * @param {string|null} message - 响应消息
     * @returns {Object} 返回响应结果
     */
    static handleNullResponse(data, message) {
        const status = !data && message === null ? 500 : 400;
        message = message || '响应对象无效';
        errorLogger.error(`Null Response: ${message}`); // 记录错误日志
        return {status, message, data};
    }

    /**
     * @description 获取默认消息的逻辑
     * @param {number} statusCode - 响应状态码
     * @returns {string} 返回对应的默认消息
     */
    static getDefaultMessage(statusCode) {
        const messages = {
            200: '操作成功',
            201: '资源创建成功',
            204: '无内容',
            400: '请求参数错误',
            401: '未授权',
            403: '禁止访问',
            404: '资源未找到',
            500: '服务器内部错误',
        };
        return messages[statusCode] || '发生未知错误';
    }

    /**
     * @description 记录响应日志的逻辑
     * @param {number} statusCode - 响应状态码
     * @param {string} message - 日志消息
     */
    static logResponse(statusCode, message) {
        if (statusCode < 200 || statusCode >= 600) {
            logger.error(`Unknown status code: ${statusCode} - ${message}`);
            errorLogger.error(`Unknown status code: ${statusCode} - ${message}`);
            return;
        }

        const isSuccess = statusCode >= 200 && statusCode < 300;
        const isClientError = statusCode >= 400 && statusCode < 500;
        const isServerError = statusCode >= 500;

        if (isSuccess) {
            logger.info(`${statusCode} Success: ${message}`);
        } else if (isClientError) {
            logger.warn(`${statusCode} Client Error: ${message}`);
            errorLogger.warn(`${statusCode} Client Error: ${message}`); // 记录客户端错误
        } else if (isServerError) {
            logger.error(`${statusCode} Server Error: ${message}`);
            errorLogger.error(`${statusCode} Server Error: ${message}`); // 记录服务器错误
        }
    }

    /**
     * @description 根据状态码获取响应状态
     * @param {number} statusCode - 响应状态码
     * @returns {string} 返回响应状态
     */
    static getResponseStatus(statusCode) {
        if (statusCode >= 200 && statusCode < 300) return 'success'; // 请求成功
        if (statusCode >= 300 && statusCode < 400) return 'redirect'; // 请求被重定向
        if (statusCode >= 400 && statusCode < 500) return 'client error'; // 客户端错误
        if (statusCode >= 500) return 'server error'; // 服务器错误
        return 'unknown'; // 其他未知状态
    }
}

export default ResponseHandler;
